keras有提供數種Layer類別使用,但這邊先看最常用的類別怎麼初始運作,在舉一反三去看其它的應用。
先看一下範例:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(units=64, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
model.build(input_shape=(None, 3))
如此可以初步建構一個類神經網路。
本節要先認識一下層,剛開始做了什麼。
類別 "keras.engine.base_layer " 扮演建構模型中重要的角色,也就是說,模型是由這些類別組合出來的。
一開始新增物件實體,重點在設定部分,包含父類別的建構子也是在做設定相關屬性的動作。這邊認識有如先見見客人客戶一般,之後再深入聊聊的概念。
這些設定會影響隨後訓練會怎麼運作。所以初始建構類別實體運作著重在參數設定。在順序上先知道運作就好,一開始直接去看每個參數是做什麼,實際上無法融會貫通,剛開始有看等於沒看,所以先了解運作與目的即可,待之後的步驟就會反覆回頭發現這些設定的內容要做什麼,這樣的順序是比較有效率的。
這邊點到的運作重點為:
keras.layers.core.dense 繼承 keras.engine.base_layer.Layer,針對 Dense Layer 大概檢視一下其類別內容長什麼樣子:
而首先到 keras.layers.core.dense 的父類別 "keras.engine.base_layer.Layer" 的建構子方法__new__中。
建構子主要會把 keras.layers.core.dense的 init 方法的參數名稱取出:
['self', 'units', 'activation', 'use_bias', 'kernel_initializer', 'bias_initializer', 'kernel_regularizer', 'bias_regularizer', 'activity_regularizer', 'kernel_constraint', 'bias_constraint']
將這些參數對應實際所傳的值組成dictionary,更新到kwargs中,供後續初始化時使用。
如此案例,layers.Dense(units=64, activation='relu'), 參數值64就會對應到 'units', 會將 {'units': 64} 更新到 **kwargs中成為 kwargs = {'activation': 'relu', 'units': 64} 。
接下來 執行 keras.layers.core.dense 的 init 方法。此方法被@utils.allow_initializer_layout裝飾,稍後回來敘述。於此方法中,將會初始化以下欄位:
(1) keras.layers.core.dense.Dense.units = int(units):
為輸出張量的維度值。於範例程式參數值為 64。
(2) keras.layers.core.dense.Dense.activation = activations.get({activation_name}):
設定激活函數。
{activation_name}為參數所指定activation="relu",會透過位於keras.activations
中activations.get 方法取得函式主體,取得方式為從 keras.layers.activation 此模組中定義的
callable物件取得。由此例activation="relu",會於keras.activations 中被搜尋到。最後透
過keras.saving.serialization_lib.deserialize_keras_object函式將對應到 types.FunctionType
的relu函式主體回傳。
(3) keras.layers.core.dense.Dense.use_bias = True:
是否使用bias向量,預設True。
(4) keras.layers.core.dense.Dense.kernel_initializer = initializers.get({kernel_initializer}):
keras文件說明此參數為:Initializer for the kernel weights matrix。
透過 keras.initializers.get 來取得instance。keras.initializers.get經由傳入預設
{kernel_initializer}='glorot_uniform'字串,進而取得由
keras.saving.legacy.serialization.deserialize_keras_object 所產生的 instance object。這邊會回
傳keras.initializers.initializers.GlorotUniform。
(如果非 legacy之 module,則會由keras.saving.serialization_lib.deserialize_keras_object函式來
回傳 instance object,類似activations.get函式所實行之方式。)
(5) keras.layers.core.dense.Dense.bias_initializer = initializers.get({bias_initializer}):
keras文件說明此參數為:Initializer for the bias vector。
透過 keras.initializers.get 來取得instance。因預設{bias_initializer} = None,所以沒有指定參數
的話也是回傳None。
(6) keras.layers.core.dense.Dense.kernel_regularizer = regularizers.get({kernel_regularizer}):
keras文件說明此參數為:Regularizer function applied to the kernel weights matrix.
透過 keras.initializers.get 來取得instance。因預設{kernel_regularizer} = None,所以沒有指定參數
的話也是回傳None。
(7) keras.layers.core.dense.Dense.bias_regularizer = regularizers.get({bias_regularizer}):
keras文件說明此參數為:Regularizer function applied to the bias vector。
透過 keras.initializers.get 來取得instance。因預設{bias_regularizer} = None,所以沒有指定參數的
話也是回傳None。
(8) keras.layers.core.dense.Dense.kernel_constraint = constraints.get({kernel_constraint}):
keras文件說明此參數為:Constraint function applied to the kernel weights matrix。
透過 keras.initializers.get 來取得instance。因預設{kernel_constraint} = None,所以沒有指定參數
的話也是回傳None。
(9) keras.layers.core.dense.Dense.bias_constraint = constraints.get({bias_constraint}):
keras文件說明此參數為:Constraint function applied to the bias vector。
透過 keras.initializers.get 來取得instance。因預設{bias_constraint} = None,所以沒有指定參數的話
也是回傳None。
(10)keras.layers.core.dense.Dense.input_spec = InputSpec(min_ndim=2):
透過keras.engine.input_spec 類別指定每個輸入張量的rank、dtype 和 shape。
(11)keras.layers.core.dense.Dense.supports_masking = True:
設定當序列數據丟失,將其忽略的機制。
keras.layers.core.dense 的 init 方法執行完後,因為@utils.allow_initializer_layout修飾子裝飾了此__init__方法,所以會執行utils.allow_initializer_layout的內容:
檢查是否keras.layers.core.dense的參數是否有符合
[
"alpha_initializer","beta_initializer","bias_initializer","depthwise_initializer","embeddings_initializer","gamma_initializer","kernel_initializer","moving_mean_initializer","moving_variance_initializer","pointwise_initializer","recurrent_initializer",
]
其中參數名稱,若有符合且存在實例物件,則直接設定對應名稱屬性(若無則新增屬性)到keras.layers.core.dense 實例內。
而每個 keras.layers.core.dense 要透過 build 函式建構後,模型會再逐一呼叫 call 函式來進行相關的運算。
以上是建構模型時使用keras.layers.core.dense類別初始化過程,未來用來組合模型的內容的紀錄。